﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using FrasesSimpsonsMvc.Models;

namespace FrasesSimpsonsMvc.Controllers
{
    public class FraseController : BaseController
    {

        public FraseController() : base() { }

        public ActionResult Index()
        {
            var frases = from t in Context.Frases
                         select t;

            foreach (var frase in frases)
            {
                frase.LoadRelatedEntities();
            }

            return View(frases.ToList());
        }

        public ActionResult Detail(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            var frases = (from t in Context.Frases
                         where t.Id >= id.Value
                         select t).Take(2).ToList();

            if (frases.Count == 0 || frases[0].Id != id.Value)
                return RedirectToAction("Index");

            if (frases.Count == 2)
                 ViewData["SiguienteId"] = frases[1].Id;

            frases[0].LoadRelatedEntities();

            return View(frases[0]);
        }

        public ActionResult Delete(int id)
        {
            var fraseABorrar = Context.Frases.Where(f => f.Id == id).FirstOrDefault();

            fraseABorrar.LoadRelatedEntities();

            return View(fraseABorrar);
        }

        public ActionResult Deleted()
        {
            var borradas = Context.FrasesHistoria.Where(h => h.Borrado == true).ToList();

            return View(borradas);
        }

        public ActionResult History(int id)
        {
            var frase = Context.Frases.Where(f => f.Id == id).FirstOrDefault();

            if (frase == null)
                return RedirectToAction("Index", "Home");

            var historias = Context.FrasesHistoria.Where(h => h.FrasesId == frase.Id).ToList();
            foreach (var historia in historias)
            {
                historia.LoadRelatedEntities();
            }

            ViewData["Historias"] = historias;

            return View(frase);
        }

        [CaptchaValidator]
        [HttpPost]
        public ActionResult ConfirmDelete(int id, bool captchaValid)
        {                   
            if (!captchaValid)
                return RedirectToAction("InvalidCaptcha", "Home");

            var fraseABorrar = Context.Frases.Where(f => f.Id == id).FirstOrDefault();

            if (fraseABorrar != null)
            {
                var historia = new FrasesHistoria(fraseABorrar);
                historia.Borrado = true;
                Context.AddToFrasesHistoria(historia);

                Context.DeleteObject(fraseABorrar);
                Context.SaveChanges();
            }
            return RedirectToAction("Index", "Home");
        }

        public ActionResult Last()
        {
            var ultimasFrases = (from p in Context.Frases
                                 orderby p.Id descending
                                 select p).Take(9);

            foreach (var frase in ultimasFrases)
            {
                frase.LoadRelatedEntities();
            }

            return View(ultimasFrases.ToList());
        }

        public ActionResult Add()
        {
            LlenarCapitulos();

            var personajes = (from p in Context.Personajes
                             orderby p.Nombre
                             select p).ToList();

            var personajesMod = new List<Personajes>(personajes.Count + 5);
            personajesMod.Add(personajes.Single(p => p.Nombre == "Homero Simpson"));
            personajesMod.Add(personajes.Single(p => p.Nombre == "Marge Simpson"));
            personajesMod.Add(personajes.Single(p => p.Nombre == "Bart Simpson"));
            personajesMod.Add(personajes.Single(p => p.Nombre == "Lisa Simpson"));
            personajesMod.Add(new Personajes { Id = -1, Nombre = "----------------------"});
            personajesMod.AddRange(personajes);

            ViewData["Personajes"] = new SelectList(personajesMod, "Id", "Nombre");
            ViewData["LinkVideos"] = new SelectList(new List<Videos>(), "Link", "Link");
            ViewData["LinkImagenes"] = new SelectList(new List<Imagenes>(), "Link", "Link");

            return View();
        }

        private void LlenarCapitulos()
        {
            var capitulos = from t in Context.Capitulos
                            select t;

            var selectList = new List<SelectListItem>();
            foreach (var capitulo in capitulos)
            {
                capitulo.LoadRelatedEntities();
                var texto = String.Format("Temporada {0:00} - Capitulo {1:00} - {2}", capitulo.Temporadas.Numero, capitulo.Numero, capitulo.Nombre);
                selectList.Add(new SelectListItem() { Text = texto, Value = capitulo.Id.ToString() });
            }

            ViewData["Capitulos"] = selectList;
        }

        public ActionResult Edit(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            var frase = (from t in Context.Frases
                         where t.Id == id
                         select t).FirstOrDefault();

            if (frase == null)
                return RedirectToAction("Index");

            frase.LoadRelatedEntities();

            LlenarCapitulos();

            if (frase.Capitulos != null)
                ViewData["CapituloId"] = frase.Capitulos.Id;

            ViewData["LinkVideos"] = new SelectList(frase.Videos.ToList(), "Link", "Link");
            ViewData["LinkImagenes"] = new SelectList(frase.Imagenes.ToList(), "Link", "Link");

            return View(frase);
        }

        [CaptchaValidator] 
        [HttpPost]
        public ActionResult Save(Frases frase, FormCollection form, bool captchaValid)
        {
            if (!captchaValid)
                return RedirectToAction("InvalidCaptcha", "Home");

            Frases fraseToStore = frase;

            var storedFrase = (from f in Context.Frases
                               where f.Id == frase.Id
                               select f).FirstOrDefault();
            
            if (storedFrase != null)
            {
                var historia = new FrasesHistoria(storedFrase);
                Context.AddToFrasesHistoria(historia);

                fraseToStore = storedFrase;
                fraseToStore.LoadRelatedEntities();
                fraseToStore.Videos.Clear();
                fraseToStore.Imagenes.Clear();
            }

            fraseToStore.Fecha = DateTime.Now;

            IList<Personajes> personajesAsociados = new List<Personajes>();
            if (form["Personajes"] != null)
            {
                foreach (var personajeId in form["Personajes"].Split(','))
                {
                    int id = Int32.Parse(personajeId);
                    if (id >= 0)
                        fraseToStore.Personajes.Add((from p in Context.Personajes where p.Id == id select p).First());
                }
            }

            if (form["LinkVideos"] != null)
            {
                foreach (var v in form["LinkVideos"].Split(','))
                {
                    var video = new Videos() { IdiomaVideo = Idioma.Latinoamiericano, Link = v };
                    Context.AddToVideos(video);
                    fraseToStore.Videos.Add(video);
                }
            }

            if (form["LinkImagenes"] != null)
            {
                foreach (var i in form["LinkImagenes"].Split(','))
                {
                    var imagen = new Imagenes() { Link = i };
                    Context.AddToImagenes(imagen);
                    fraseToStore.Imagenes.Add(imagen);
                }
            }

            if (!String.IsNullOrEmpty(form["CapituloId"]))
            {
                var capituloId = Int32.Parse(form["CapituloId"]);
                var capitulo = (from c in Context.Capitulos
                                where c.Id == capituloId
                                select c).FirstOrDefault();
                fraseToStore.Capitulos = capitulo;
            }
            else
            {
                //Caso especial cuando quiero borrar un capitulo en la edicion
                if (storedFrase != null && storedFrase.Capitulos != null)
                    storedFrase.Capitulos = null;
            }

            if (storedFrase != null)
            {
                //Update
                fraseToStore.Descripcion = frase.Descripcion.Replace("\r", "").Replace("\n", "|\n");
                fraseToStore.Dialogo = frase.Dialogo;
                fraseToStore.Tiempo = frase.Tiempo;
                fraseToStore.Keywords = frase.Keywords;
                if (String.IsNullOrEmpty(storedFrase.Posteador))
                    fraseToStore.Posteador = frase.Posteador;
            }
            else
            {
                //Create
                Context.AddToFrases(fraseToStore);
            }

            Context.SaveChanges();

            return RedirectToAction("Detail", new { id = frase.Id});
        }

    }
}
